"""
在数值分析里面，牛顿法(亦称牛顿拉弗森法)是一种方法，
    用于查找更好的根(或零点)的例子寻根算法。
    牛顿法也被用于求函数的最值。由于函数取最值的点处的导数值为零，
    故可用牛顿法求导函数的零点，其迭代式为x=x1=x0-f(x0)/f'(x0)
    例子：请用牛顿法，求函数 x*3-2x-5 在 3 附近的零点。
    题解：newton.py
    问题升级：如果题目不提供导函数，只提供本函数表达式，
        但是提供一个合理区间，如何求解该区间内的零点？
"""


def zero_point(f, area, flex):
    x0 = area[0]
    x1 = area[1]
    while True:
        x2 = x1 - (f(x1) / ((f(x1) - f(x0)) / (x1 - x0)))
        if abs(x2 - x1) < flex:
            return x2
        x0 = x1
        x1 = x2


def f(x):
    return x**3 - 2 * x - 5


print(zero_point(f, [3, 3.5], 10e-5))
